import os 
import pygame
from  PluginBase import PluginBase, tool

'''
提示词：播放本地歌曲《爱一个人好难》,播放本地歌曲“爱一个人好难”
'''
class Player(PluginBase):
    '''播放本地音乐或本地歌曲,提示词：播放本地歌曲《爱一个人好难》'''
    Player_music_path = 'f:\\MP3'  # 音乐保存的目录
        
    @tool(description="""播放本地音乐或歌曲，需调用get_player_StartMusic函数。
          参数为歌曲名称，格式为{music_name: string};
          fristcall:首次调用时，默认True，再次调用时，默认False。""",
          music_name="歌曲名称",
          fristcall="是否首次调用，默认True") 
    def get_player_StartMusic(music_name: str,fristcall:bool) -> str:
        """ 
        此函数用于播放指定名称的本地音乐文件。 

        参数:
        music_name (str): 要播放的音乐文件的名称，不包含文件扩展名。
        fristcall (bool): 是否首次调用，默认True；再次调用时，默认False。
        
        返回:
        str: 如果音乐文件存在并成功开始播放，返回播放启动的消息；如果文件不存在，返回文件不存在的消息；如果发生异常，返回错误消息。
        """ 
        
        try:
            music_file_path = Player.Player_music_path+ f"{music_name}.mp3"
            if fristcall:
                user_input = input(f"""系统对话->即将打开本地音乐 {music_file_path}，确认执行？
                (no:不执行; 其他任意按键：代表执行,如1): """).strip().lower()
            else:
                user_input='yes'
            
            if user_input != 'no':            
                # 确保文件路径是有效的
                if not os.path.exists(music_file_path):
                    music_file_path=f"音乐{music_name} 不存在" 
                else:
                    # 默认应用打开文件                
                    pygame.mixer.init()
                    pygame.mixer.music.load(music_file_path)
                    pygame.mixer.music.play() 
                    #print(f"播放音乐{music_name} 正在启动...")
                    music_file_path=f"播放音乐《{music_name}》 ，正在启动..."            
            else:
                music_file_path= "用户已经取消播放操作。"
            return music_file_path
        except Exception as e:
            return f"播放音乐失败:{str(e)}" 
        
    @tool(description="停止播放音乐")
    def get_player_Stop()->str:
        """
        此函数用于停止当前正在播放的音乐，并卸载音频文件。

        返回:
        str: 如果音乐停止和文件卸载成功，返回播放停止的消息；如果发生异常，返回错误消息。
        """
        try:
            # 立即停止当前正在播放的音乐，并释放相关资源
            pygame.mixer.music.stop()
            # 卸载当前加载的音频文件，以释放系统资源
            pygame.mixer.music.unload()
            return f"播放音乐已经停止"
        except Exception as e:
            return f"播放音乐失败:{str(e)}" 
